<?php
/*********************************************************************************************/
//																							 //
//                              InstantCMS v1.5   (c) 2009 FREEWARE                          //
//	 					  http://www.instantcms.ru/, info@instantcms.ru                      //
//                                                                                           //
// 						    written by Vladimir E. Obukhov, 2007-2009                        //
//                                                                                           //
//                                   LICENSED BY GNU/GPL v2                                  //
//                                                                                           //
/*********************************************************************************************/

class cmsDatabase {

    private static $instance;

    public $q_count = 0;
    public $q_dump  = '';

    public $db_link;

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
private function __construct(){
    $inConf = cmsConfig::getInstance();

    $this->db_link = mysql_connect($inConf->db_host, $inConf->db_user, $inConf->db_pass) or die('Cannot connect to MySQL server');

    mysql_select_db($inConf->db_base, $this->db_link) or die('Cannot select "'.$inConf->db_base.'" database');

    $this->query("SET NAMES cp1251");
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public static function getInstance() {
    if (self::$instance === null) {
        self::$instance = new self;
    }
    return self::$instance;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
protected function replacePrefix( $sql, $prefix='cms_' ) {

    $inConf = cmsConfig::getInstance();
    
    $sql = trim( $sql );
    $escaped = false;
    $quoteChar = '';
    $n = strlen($sql);
    $startPos = 0;
    $literal = '';

    while ($startPos < $n) {
        $ip = strpos($sql, $prefix, $startPos);
        if ($ip === false) { break; }
        $j = strpos( $sql, "'", $startPos );
        $k = strpos( $sql, '"', $startPos );
        if (($k !== FALSE) && (($k < $j) || ($j === FALSE))) {
            $quoteChar = '"';
            $j = $k;
        } else {
            $quoteChar = "'";
        }

        if ($j === false) { $j = $n; }

        $literal .= str_replace( $prefix, $inConf->db_prefix.'_', substr( $sql, $startPos, $j - $startPos ) );
        $startPos = $j;

        $j = $startPos + 1;
        if ($j >= $n) { break; }

        // quote comes first, find end of quote
        while (TRUE) {
            $k = strpos( $sql, $quoteChar, $j );
            $escaped = false;
            if ($k === false) { break; }
            $l = $k - 1;
            while ($l >= 0 && $sql{$l} == '\\') { $l--; $escaped = !$escaped; }
            if ($escaped) { $j = $k+1; continue; }
            break;
        }
        if ($k === FALSE) { //error in the query - no end quote; ignore it
            break;
        }
        $literal .= substr( $sql, $startPos, $k - $startPos + 1 );
        $startPos = $k+1;
    }
    if ($startPos < $n) {
        $literal .= substr( $sql, $startPos, $n - $startPos );
    }
    return $literal;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public function query($sql){
    $inConf = cmsConfig::getInstance();
	$sql = $this->replacePrefix($sql);
    $result = mysql_query($sql, $this->db_link);

    if ($inConf->debug){
        $this->q_count  += 1;
        $this->q_dump   .= '<pre>'.$sql.'</pre><hr/>';
    }

    if (mysql_error() && $inConf->debug){
        die('<div style="margin:2px;border:solid 1px gray;padding:10px">DATABASE ERROR: <pre>'.$sql.'</pre>'.mysql_error().'</div>');
    }
    
    return $result;
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public function num_rows($result){
    return (int)mysql_num_rows($result);
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public function fetch_assoc($result){
    return mysql_fetch_assoc($result);
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public function fetch_row($result){
    return mysql_fetch_row($result);
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public function affected_rows(){
    return mysql_affected_rows($this->db_link);
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public function get_last_id($table){
    $sql    = "SELECT LAST_INSERT_ID() as lastid FROM $table LIMIT 1";
    $result = $this->query($sql);

    if ($this->num_rows($result)){
        $data = $this->fetch_assoc($result);
        return $data['lastid'];
    } else {
        return 0;
    }    
}


/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public function rows_count($table, $where, $limit=0){
    $sql = "SELECT * FROM $table WHERE $where";

    if ($limit) { $sql .= " LIMIT ".$limit; }

    $result = $this->query($sql);
    return $this->num_rows($result);
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public function get_field($table, $where, $field){

    $sql    = "SELECT $field as getfield FROM $table WHERE $where LIMIT 1";
    $result = $this->query($sql);

    if ($this->num_rows($result)){
        $data = $this->fetch_assoc($result);
        return $data['getfield'];
    } else {
        return false;
    }

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public function get_fields($table, $where, $fields, $order='id ASC'){

    $sql    = "SELECT $fields FROM $table WHERE $where ORDER BY $order LIMIT 1";
    $result = $this->query($sql);

    if ($this->num_rows($result)){
        $data = $this->fetch_assoc($result);
        return $data;
    } else {
        return false;
    }
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public function get_table($table, $where='', $fields='*'){

    $list = array();

    $sql = "SELECT $fields FROM $table";
    if ($where) { $sql .= ' WHERE '.$where; }
    $result = $this->query($sql);

    if ($this->num_rows($result)){
        while($data = $this->fetch_assoc($result)){
            $list[] = $data;
        }
        return $list;
    } else {
        return false;
    }
    
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public function errno() {
    return mysql_errno($this->db_link);
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public function error() {
    return mysql_error($this->db_link);
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public function escape_string($string) {
    return mysql_escape_string($string); 
}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public function isFieldExists($table, $field){

    $sql    = "SHOW COLUMNS FROM $table WHERE Field = '$field'";
    $result = $this->query($sql);

    if ($this->errno()) { return false; }

    return (bool)$this->num_rows($result);

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public function isFieldType($table, $field, $type){

    $sql    = "SHOW COLUMNS FROM $table WHERE Field = '$field' AND Type = '$type'";
    $result = $this->query($sql);

    if ($this->errno()) { return false; }

    return (bool)$this->num_rows($result);

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
public function isTableExists($table){

    $sql    = "SELECT * FROM $table LIMIT 1";
    $result = $this->query($sql);
    
    if ($this->errno()){ return false; }

    return true;

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

}

?>